草庐IT

AOT 和 JIT

全部标签

c# - 检索 JIT 输出

我有兴趣查看C#程序(不是CLR字节码指令)的实际x86程序集输出。有什么好的方法吗? 最佳答案 在VisualStudio中调试应用程序时,您可以右键单击已停止(使用断点)的代码,然后单击“转到反汇编”。您可以通过native指令进行调试。至于使用磁盘上的*.exe文件,也许你可以使用NGen生成native输出然后反汇编它(虽然我从未尝试过,所以我不能保证它会起作用)。以下是用C#编写的简单算术运算的一些示例操作码:intx=5;movdwordptr[ebp-40h],5inty=6;movdwordptr[ebp-44h],

c# - 有没有办法让 .Net JIT 或 C# 编译器优化掉空的 for 循环?

Does.NETJIToptimizeemptyloopsaway?的跟进:下面的程序只运行一个空循环十亿次并打印出运行时间。在我的机器上需要700毫秒,我很好奇是否有办法让抖动优化空循环。usingSystem;namespaceConsoleApplication1{classProgram{staticvoidMain(){varstart=DateTime.Now;for(vari=0;i据我所知,答案是否定的,但我不知道是否有我可能没有尝试过的隐藏编译器选项。我已经确保在Release模式下编译并在没有附加调试器的情况下运行,但仍然需要700毫秒来运行这个空循环。我也尝试了N

c# - 使用 CoreRT/另一个 AOT 编译 .net 核心应用程序

我正在ASP.NETCORE1.0上构建RESTAPI。在生产中,恕我直言,不使用JIT是非常有用的,因为带有应用程序的docker容器不断扩大和缩小,在CI期间一遍又一遍地重新部署,因此对每个已部署容器的即时编译会导致严重的延迟,LB健康检查死亡和其他痛苦。据我所知,使用dotnetCLI进行的native编译已停止。我尝试使用CoreRT进行构建但没有运气(由于复杂性,需要详细信息)。由于这个问题非常抽象,我没有提供示例代码或详细信息,所以一开始只有几个问题:我的假设是否正确-提前编译是否会解决每个路径首次执行缓慢的问题-或者-是否有任何其他解决方案?如果是真的,目前是否可以从.N

c# - 什么时候进行提前 (AOT) 编译?

我正在为Web应用程序使用C#.NET。我读过JIT编译发生在运行时,这意味着(如果我错了请纠正我)编译将在请求到达IIS时发生。在解决方案的构建阶段使用csc.exe进行另一次编译,使用MSBuild将高级代码转换为CIL。如果没有JIT而我们想使用AOT,那么AOT适合所有这一切吗?我的问题是,在从构建代码到第一个请求的整个阶段中,AOT编译发生在什么时候?(平台/框架无关紧要) 最佳答案 经过大量谷歌搜索和研究,我发现我对编译器的基本理解是错误的。编译器是将语言X的程序转换为语言Y的程序。语言Y可以是任何东西(native机器

c# - JIT 编译器是编译器还是解释器?

我的问题是将IL转换为机器语言的JIT编译器到底是编译器还是解释器。还有一个问题:HTML、JavaScript是编译型语言还是解释型语言?提前致谢 最佳答案 JIT(justintime)编译器是一种编译器。它进行优化以及编译为机器代码。(甚至称为编译器)HTML、Javascript被解释,它们由Web浏览器按原样读取,并以最少的错误修复和优化运行。 关于c#-JIT编译器是编译器还是解释器?,我们在StackOverflow上找到一个类似的问题: htt

c# - JIT 编译器的 IL 优化

我正在开发一个发出IL代码的编译器。重要的是,生成的IL由Mono和Microsoft.NETJIT编译器JIT为尽可能最快的机器代码。我的问题是:优化以下模式是否有意义:'stloc.0;ldloc.0;ret'=>'ret''ldc.i4.0;conv.r8'=>'ldc.r8.0'等等,或者JIT是否足够聪明来处理这些?是否有包含Microsoft/MonoJIT编译器执行的优化列表的规范?是否有任何关于优化IL的实用建议/最佳实践的好读物,以便JIT编译器可以反过来生成最佳机器代码(性能方面)? 最佳答案 您描述的两种模式是

c# - .NET JIT 编译器可变优化

https://msdn.microsoft.com/en-us/magazine/jj883956.aspxConsiderthepollinglooppattern:privatebool_flag=true;publicvoidRun(){//Set_flagtofalseonanotherthreadnewThread(()=>{_flag=false;}).Start();//Pollthe_flagfielduntilitissettofalsewhile(_flag);//Theloopmightneverterminate!}Inthiscase,the.NET4.5J

c# - 强制 .NET JIT 编译器在应用程序启动期间生成最优化的代码

我正在用C#编写一个DSP应用程序(基本上是一个多轨编辑器)。我已经在不同的机器上对它进行了很长一段时间的分析,我注意到了一些“奇怪”的事情。在我的家用机器上,播放循环的第一次运行占用了大约50%-60%的可用时间(我假设这是由于JIT完成它的工作),然后对于后续循环,它下降到稳定的5%消耗。问题是,如果我在较慢的计算机上运行该应用程序,第一次运行会占用比可用时间更多的时间,导致播放中断并弄乱输出音频,这是NotAcceptable。之后,它会下降到8%-10%的消耗。即使在第一次运行后,应用程序仍然不时调用一些耗时的例程(大约每2秒一次),这导致稳定的5%消耗经历了20%-25%的非

c# - 在 .NET 中,为什么常量在编译时而不是在 JIT 时求值?

今天,当我更改静态类中公开可见常量的值,然后用新编译的版本替换程序集的旧副本时,我有点吃惊。令人惊讶的是,引用程序集的现有程序没有获取常量的新值。也就是说,我没有重新编译可执行文件,而是只是替换了那个程序集。我的实验的完整描述位于Howconstantisaconstant?我承认我对这种行为感到非常惊讶。我明白发生了什么,但我不明白为什么。是否有特殊的技术原因导致无法在JIT时间而不是编译时间获取常量?在某些情况下这样做会破坏事情吗? 最佳答案 常量应该是常量。对于所有时间。常量是诸如pi的值或铅原子中的质子数之类的东西。如果你的

c# - .NET JIT 代码缓存泄漏?

我们有一个用.Net3.5编写的服务器组件。它在WindowsServer2008StandardEdition上作为服务运行。它工作得很好,但在一段时间(几天)后,我们注意到速度大幅下降和工作集增加。我们预计会发生某种内存泄漏,并使用WinDBG/SOS来分析进程的转储。不幸的是,GC堆没有显示任何泄漏,但我们注意到JIT代码堆已经从开始后的8MB增长到几天后的1GB以上。我们自己不使用任何动态代码生成技术。我们使用以动态代码生成而闻名的Linq2SQL,但我们不知道它是否会导致这样的问题。主要问题是是否有任何技术可以分析转储并检查WinDBG转储中显示的所有主机代码堆block来自